정적 페이지(Static Pages)와 동적 페이지(Dynamic Pages)정적 페이지(Static Pages)서버(Web Server)에 미리 저장된 파일(HTML, Image, JavaScript 등)이 그대로 전달되는 웹페이지Web Server는 파일 경로 이름을 받아 경로와 일치하는 file contents를 반환함서버는 사용자 요청에 해당하는 저장된 웹 페이지를 보냄사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹 페이지를 보게 됨항상 동일한 페이지를 반환함 (모든 사용자는 같은 결과의 웹 페이지를 서버에 요청하고 응답 받음)Ex) image, html, css, javascript 파일과 같이 컴퓨터에 저장되어 있는 파일들동적 페이지(Dynamic Pages)서버(Web Server)에 있는 데이터들을 스크립트에 의해 가공처리한 후 클라이언트에게 전송하는 웹페이지사용자는 상황, 시간, 요청 등에 따라 달라지는 웹 페이지를 보게 됨같은 페이지라도 사용자마다 다른 결과의 웹 페이지를 서버에 요청하고 받을 수 있음인자의 내용에 맞게 동적인 contents를 반환함즉, 웹 서버에 의해서 실행되는 프로그램을 통해서 만들어진 결과물개발자는 서블릿(Servlet)에 doGet()을 구현함우리가 보는 대부분의 웹페이지는 동적 웹 페이지Ex) 네이버 블로그, 티스토리 등
Web Server와 WASWeb Server💡웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(.html .jpeg .css 등)를 제공하는 컴퓨터 프로그램HTTP 프로토콜을 기반으로 하여 클라이언트(웹 브라우저 또는 웹 크롤러)의 요청을 서비스하는 기능을 담당한다.
기능 1)
정적 컨텐츠 제공WAS를 거치지 않고 바로 자원을 제공함기능 2)
동적인 컨텐츠 제공을 위한 요청 전달클라이언트의 요청(Request)을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(Response)함예시) Apache Server, Nginx
WAS💡동적인 컨텐츠를 제공하기 위해 만들어진 Application Server주로 DB 서버와 같이 수행되는데 클라이언트의 요청을 DB 서버와의 매개를 통해 비즈니스 로직 등을 처리하는 역할을 수행함WAS = Web Server + Web Container
Web ServerWeb ContainerJSP, Servlet 구동 환경 제공예시: Tomcat(주의! 부록 참고), JBoss, Jeus, Wep Sphere
WAS는 웹 서버와 웹 컨테이너가 합쳐진 형태로서, 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다. 덕분에 사용자의 다양한 요구에 맞춰 웹 서비스를 제공할 수 있다. WAS는 JSP, Servlet 등 구동환경을 제공해주기 때문에 웹 컨테이너 혹은 서블릿 컨테이너라고도 불린다.
컨테이너(Container)컨테이너(Container)의 개념
컨테이너는 동적인 데이터들을 처리하여 정적인 페이지로 생성해주는 소프트웨어 모듈 이다. 사용자가 로그인해서 My Page 메뉴에 들어간다고 가정해보겠다. 이 메뉴에서는 각자 사용자에 따라 보여질 정보가 다르다. 사용자의 요청이 들어오면 웹 서버는 정적인 요소만 클라이언트 측에 보낼 수 있고, 동적으로 처리해야 하는 부분은 처리할 수 없다. 컨테이너는 이러한 부분을 대신 처리해서 웹 서버에 정적인 파일로 만들어서 보내주는 모듈이라고 생각하면 될 것 같다.
클라이언트 측에서 크롬 개발자 도구를 이용하여 파일을 살펴보면 php, ejs 파일도 만든 소스코드도 전부 html로 전송된다. 이는 해당 파일에서 처리해야할 부분을 처리하고 정적 파일로 만든 후에 클라이언트에게 보내는 것이다. php 나 js 코드 등으로 처리한 코드 부분도 클라이언트 측에서는 볼 수 없다.
컨테이너(Container)의 목적
참고) Java 기반 프레임워크 Spring에서의 컨테이너, 그중 서블릿 컨테이너에 대한 설명이다.
Apache는 CGI라는 개념을 지원한다.
CGI란?Common Gateway Interface(공용 게이트웨이 인터페이스)인터페이스로서, 웹 서버 상에서 프로그램을 동작시키기 위한 방법을 정의한 프로그램웹 서버와 외부 프로그램 사이에서 정보를 주고 받는 방법이나 규약쉽게 설명하자면, 두 개 이상의 컴퓨터 간의 자료들을 주고 받는 프로그램, 또는 주고 받는 것 자체를 의미PHP, Perl, Python등의 언어는 Apache를 통해 CGI를 적용시키는 것이 가능한데, JAVA는 안된다.즉, Java는 따로 CGI 와 같은 기능을 위해 컨테이너 라는 것이 필요하다.컨테이너(Container)의 정의
참고) Java 기반 프레임워크 Spring에서의 컨테이너, 그중 서블릿 컨테이너에 대한 설명이다.
웹 컨테이너는 Java 서블릿과 상호작용하는 WAS의 구성요소이다.서블릿의 생명주기를 관리한다.서블릿을 로드해 초기화(init())) 한다.클라이언트의 요청으로 서블릿 메소드를 호출한다.서블릿 컨테이너가 종료되면 서블릿을 종료시키고(destroy()) 메모리를 정리한다. (가비지 컬렉션)통신을 지원한다.웹 서버로부터 받은 요청을 분석해 서블릿을 실행시키고, 서블릿에서는 웹서버의 정보를 확인할 수 있도록 하는 기능을 제공한다.서블릿과 웹 서버가 서로 통신할 수 있는 쉬운 방법들을 제공한다.ServerSocket 만들기특정 포트에 리스닝연결 요청이 들어오면 스트림을 생성멀티스레딩을 지원한다.클라이언트의 요청에 따라 서블릿을 생성하고, 이미 생성된 서블릿에 대한 요청을 스레드를 생성해 실행한다.선언적 보안 관리보안에 관련된 내용을 서블릿, 자바 클래스 코드 안에 하드 코딩할 필요가 없다.즉, 필요한 데이터나 값, 코드 등을 직접 타이핑해서 집어 넣는 일이 없다.보안 관리는 배포 서술자(web.xml)에다가 기록하면 된다.JSP를 지원한다.쉽게 말해WAS 내부에서 개발자 대신 서블릿을 관리한다.WAS 별로 다양한 종류의 컨테이너를 내장하고 있으며, 이들 중 서블릿에 관련된 기능을 모아 놓은 것을 서블릿 컨테이너라 부른다. (이 포스팅의 컨테이너 정의는 서블릿 컨테이너를 두고 작성한 것이다.)서블릿 컨테이너 외에 JSP 컨테이너, EJB 컨테이너 등을 내장하고 있고, 다양한 컴포넌트들도 내장하고 있다.컴포넌트란?특정 기능이나 관련된 기능이 재사용 가능한 형태로 만들어진 프로그램소프트웨어 개발을 레고 블록 쌓듯이 진행 가능하게 한다.
컨테이너의 작동클라이언트는 웹서버로 request(요청)을 보낸다.서블릿을 포함하는 WAS는 컨테이너로 요청을 보낸다.컨테이너가 요청을 각 서블릿에게 전달한다.서블릿 메서드가 로드된다.서블릿은 컨테이너에 관련 response(응답)을 넘겨준다.컨테이너는 이를 서버에 전달한다. 서버는 응답을 클라이언트에게 전달한다.
WAS의 내부 구조
클라이언트가 요청을 보내면 웹 서버가 그 요청을 컨테이너로 전달한다.컨테이너는 배포서술자(web.xml)를 참조하여 해당 서블릿에 대한 스레드를 생성하고 요청(httpServletRequest) 및 응답(httpServletResponse) 객체를 생성하여 전달한다.컨테이너는 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다.컨테이너는 서블릿을 호출(service())하며, POST/GET 여부에 따라 doPost() 또는 doGet() 이 호출된다.호출된 doPost() 또는 doGet() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 실어 컨테이너에 전달한다.컨테이너는 전달 받은 객체를 웹 서버에 전달하고 생성되었던 스레드를 종료하고 요청(httpServletRequest) 및 응답(httpServletResponse) 객체를 소멸시킨다.스레드(thread)란?프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
Web Server와 WAS를 구분하는 이유❓WAS가 웹 서버를 포함하는 개념이라면, 왜 굳이 웹 서버와 WAS를 같이 사용하는 것일까?
1. 기능을 분리하여 서버 부하 방지
WAS 앞에 웹 서버를 둬서 웹 서버에 정적인 문서만 처리하도록하고, WAS는 애플리케이션의 로직만 수행하도록 기능을 분배해서 서버의 부담을 줄인다. 개발 공부하면서 많이 들어봤을 관심사의 분리를 하는 것이다.
2. 물리적으로 분리하여 보안 강화
SSL에 대한 암복호화 처리에 Web Server를 사용WAS의 환경 설정 파일을 외부에 노출시키지 않도록 하기 위함클라이언트와 연결하는 포트가 직접 WAS에 연결이 되어 있다면 중요한 설정 파일들이 노출될 수 있기 때문에 WAS 설정 파일을 외부에 노출시키지 않도록 하기 위함웹 서버와 WAS에 접근하는 포트가 다르기 때문에 WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수도 있다.3. 여러 대의 WAS를 연결 가능
대용량 웹 어플리케이션의 경우(여러 개의 서버 사용) Web Server와 WAS를 분리하여 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있다. 예를 들어, 앞 단의 Web Server에서 오류가 발생한 WAS를 이용하지 못하도록 한 후 WAS를 재시작함으로써 사용자는 오류를 느끼지 못하고 이용할 수 있다.
4. 여러 웹 어플리케이션 서비스 가능
예를 들어, 하나의 서버에서 PHP Application과 Java Application을 함께 사용하는 경우
웹 서비스 구조
Client - MiddleWare Server - DB Server
client는 단순히 요청만 중앙에 있는 MiddelWare Server에게 보낸다.MiddelWare Server에서 대부분의 로직이 수행된다.이 때, 데이터를 조작할 일이 있으면 DBMS에 부탁한다.로직의 결과를 Client에게 전송한다.Client는 그 결과를 화면의 보여준다.미들웨어(MiddleWare)란?양쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어*비즈니스 로직은 미들웨어 서버에서 동작하도록 한다MOM, WAS 등이 있다.
비즈니스 로직(Business Logic)
: 도메인 로직, 어플리케이션 로직
: 프로그램의 핵심 로직
: 어떻게 데이터가 생성되고 저장되고 수정되고 삭제되는지를 정의한 것
: 현실 세상의 문제를 해결하는 코드
예: 은행앱 → 금융 및 은행 업무, 틱톡 → 동영상 촬영, 감상, 댓글 및 공유
⇒ 참고: https://velog.io/@eddy_song/domain-logic
웹 서비스 구조의 구분💡1. Client -> Web Server -> DB2. Client -> Web Application Server -> DB3. Client -> Web Server -> Web Application Server -> DB
이상적인 웹 서비스 구조
Client -> Web Server -> Web Application Server -> DB
해당 구조의 동작 과정
Web Server는 클라이언트의 요청(Request)을 WAS에 보낸다.WAS는 관련된 Servlet을 메모리에 올린다.WAS는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성한다. (Thread Pool 이용)HttpServletRequest와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.Thread는 Servlet의 service() 메서드를 호출한다.service() 메서드는 요청에 맞게 doGet() 또는 doPost() 메서드를 호출한다.protected doGet(HttpServletRequest request, HttpServletResponse response)doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에 전달한다.WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달한다.생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.왜 Tomcat이 아니라 Apache Tomcat인가?
앞에서 말한대로 정적 컨텐츠를 처리하는 웹 서버에는 Apache가 있고, 동적 컨텐츠를 처리하는 WAS 서버에는 Tomcat이 있다.
근데 왜 Tomcat은 Apache Tomcat이라는 이름으로 많이 사용될까?
그 이유는 2008년에 릴리즈된 Tomcat 5.5 버전부터 정적 컨텐츠를 처리하는 기능이 추가되었는데, 이 기능이 순수 Apache를 사용하는 것에 비해 성능적 차이가 전혀 없으며 Tomcat이 Apache의 기능을 포함하고 있기 때문에 Apache Tomcat이라고 부르고 있다.
부록Java EE와 Tomcat, Spring의 관계Java EE(Java Platform, Enterprise Edition)Java EE는 기업용 애플리케이션에 필요한 기능들의 사양을 정의해둔 명세서라고 할 수 있다.
구체적으로는 JSP, Servlet, EJB, JDBC 등 기업용 애플리케이션을 개발하고 실행하는 데 필요한 사양들을 명시하고 있다. 이 사양을 각 vendor 사들이 구현하여 판매하면 개발자들은 어느 제품을 사용하더라도 새로 API를 공부하거나 OS에 따라 변경할 필요가 없는 것이다. 이렇게 Java EE의 사양에 따라 만들어진 제품이 바로 우리가 흔히 말하는 WAS(Web Application Server)이다. 대표적으로는 GlassFish, JBoss EAP 등의 제품이 있다.
Java EE 프로젝트가 오라클에서 이클립스 재단으로 이관되며 공식 명칭이 Jakarta EE로 변경되었다.
Java EE Container
위 그림을 보면 Java EE 서버가 클라이언트와 통신하는 구조를 알 수 있다. 그중에서도 Jave EE 서버에 있는 Web Container와 EJB Container를 자세히 보겠다.
Web Container는 위에서 말했듯이, 웹 클라이언트의 HTTP 요청을 받을 수 있고 servlet의 생명 주기를 관리하며 jsp, filter 등을 지원한다. Java에서는 HTTP 요청을 servlet을 통해 처리하기 때문에 Servlet Container라고도 부른다. EJB Container가 웹 브라우저 클라이언트가 요청한 비즈니스 로직을 수행하려면 Web Container를 거쳐야 한다.
EJB(Enterprise Java Beans) Container는 Java EE 응용 프로그램의 Enterprise Bean 실행을 관리하며 요청에 대한 비즈니스 로직을 수행한다. 구체적으로는 bean의 생명주기를 관리하며 보안과 transaction 관리, 리소스 풀링 등의 기능을 제공한다.
Tomcat과 Java EE의 Web Container
보통 WAS가 무엇이냐 물으면 동적 컨텐츠를 제공하는 서버이며 그 예로는 톰캣이 있다고 대답한다. 하지만 톰캣은 온전한 WAS라고 할 수 없다. Java EE를 완전히 구현한 것이 WAS인데, 톰캣은 Java EE 중에서도 Web Container만 구현하고 있기 때문이다.
Java EE에서 Web Container를 구현한 것이 Tomcat이다. 따라서 톰캣은 온전한 WAS가 아니며 HTTP 요청을 Servlet을 통해 관리한다.
스프링과 Java EE의 EJB ContainerEJB(Enterprise Java Beans) Container는 Java EE 응용 프로그램의 Enterprise Bean 실행을 관리하며 요청에 대한 비즈니스 로직을 수행한다. 즉 비즈니스 객체들을 Bean으로 관리할 수 있는 기능에 대한 스펙을 지정한 것이다.스프링과 EJB Container의 관계를 설명하려면, 먼저 EJB의 과거에 대해 알아보아야 한다.
처음엔 EJB가 제공하는 다양한 기능들 덕에 EJB가 많이 사용되었다. 하지만 EJB는 실제 사용할 때 불편한 점들이 너무 많았다. EJB를 사용하려면 제공하는 API를 상속 받아야만 했고, 그에 따른 부가적인 코드를 작성해야 하는 등의 불편함이 있었다. 뿐만 아니라 vendor 사마다 EJB를 구현한 내용이 달라 다른 vendor 사의 제품으로의 변경도 어려웠다. 미들웨어 제품에 대한 종속성을 벗어나기 위해 Java EE가 만들어졌는데, 이제는 특정 Jave EE 제품에 종속되어버리게 된 것이다.
이러한 단점때문에 개발자들은 Java EE와 같은 환경과 기술의 종속에서 벗어나 POJO(Plain Old Java Object) 방식 즉, 특정 클래스를 상속하거나 인터페이스를 구현하지 않는 가벼운 객체를 원하게 되었다. 이런 수요로 인해 Java EE를 개선하여 탄생한 것이 스프링입니다.
스프링은 더이상 비싸고 무거운 Java EE 서버를 사용하지 않아도 주요 기능들을 사용할 수 있게 만들었다. 이제 Java EE가 아닌 Tomcat과 같은 가벼운 일반 Servlet Container와 함께 사용할 수 있게 되었다. 스프링이라는 이름도 이전의 EJB 시절을 겨울에 비유하여 새로운 봄이 온다는 의미에서 지어진 것이다.
이렇듯 스프링은 POJO 방식의 프로그래밍을 지향하면서 적용한 기술이나 메서드가 구현하는 코드에 직접 반영되지 않는 비침투적인(non-invasive) 기술을 사용한다. 이 비침투적인 기술을 위한 스프링의 핵심 기능이 바로 IoC/DI(Inversion of Control/Dependency Injection), AOP(Aspect Oriented Programimg), PSA(Portable Service Abstraction)인 것이다.
결론Java EE는 기업용 어플리케이션에 필요한 기능들의 사양을 정의해둔 명세서이다.Java EE에서 Web Container를 구현한 것이 톰캣입니다. 따라서 톰캣은 온전한 WAS가 아니며 HTTP 요청을 Servlet을 통해 관리한다.Java EE의 단점을 개선하여 탄생한 것이 스프링입니다. 스프링은 POJO 방식의 프로그래밍을 지향하며 비침투적인 기술을 지향한다.
참조https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.htmlhttps://velog.io/@falling_star3/web-Web-Server와-WASWeb-Application-Serverhttps://velog.io/@hyj5419/웹-서비스-구조https://velog.io/@falling_star3/web-Web-Server와-WASWeb-Application-Serverhttps://melonicedlatte.com/web/2019/06/23/210300.htmlhttps://doozi316.github.io/web/2020/09/13/WEB26/https://inpa.tistory.com/entry/WEB-🌐-웹-서비스-구조-정리https://codechasseur.tistory.com/25https://velog.io/@eddy_song/domain-logichttps://colour-my-memories-blue.tistory.com/14https://story.pxd.co.kr/1647
Uploaded by
N2T